package fr.contacts.controllers;

import fr.contacts.models.Contact;
import fr.contacts.models.Adresse;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class ContactsDAO {
	
	private static List<Contact> contactList;
	
	public static void initialiseContactList() {
		if (contactList == null) {
			contactList = new ArrayList<Contact>();
		}
	}
	
	//CRUD Contact
	public static void createContact(int idContactParam, String nomParam, String prenomParam, String emailParam, Date dateDeNaissanceParam, Boolean actifParam, Adresse adresseParam) {
		initialiseContactList();
		Contact contact = new Contact();
		contact.setNom(nomParam);
		contact.setPrenom(prenomParam);
		contact.setEmail(emailParam);
		contact.setDateDeNaissance(dateDeNaissanceParam);
		contact.setActif(actifParam);
		contact.setId(idContactParam);
		if (adresseParam != null) {
			contact.getAdresseList().add(adresseParam);
		}
		contactList.add(contact);
	}
	
	public static void addContact(Contact contactParam, Adresse adresseParam, int id){
		
		initialiseContactList();
		
		contactParam.setId(id);
		contactList.add(contactParam);
		
		if ( adresseParam != null) {
			contactParam.getAdresseList().add(adresseParam);
		}
		
	}
	
	public static Contact readContact(int idParam) {
		initialiseContactList();
		for (Contact contact : contactList) {
			if (idParam == contact.getId()) {
				return contact;
			}
		}
		return null;
	}
	
	public static List<Contact> readAllContact() {
		initialiseContactList();
		return contactList;
	}
	
	public static void updateContact(int idParam, String nomParam, String prenomParam, String emailParam, Date dateDeNaissanceParam, Boolean actifParam) {
		initialiseContactList();
		for (Contact contact : contactList) {
			if (idParam == contact.getId()) {
				contact.setNom(nomParam);
				contact.setPrenom(prenomParam);
				contact.setEmail(emailParam);
				contact.setDateDeNaissance(dateDeNaissanceParam);
				contact.setActif(actifParam);
				break;
			}
		}
	}
	
	public static void deleteContact(int idParam) {
		initialiseContactList();
		for (int i = 0; i < contactList.size(); i++) {
			Contact contact = contactList.get(i);
			if (idParam == contact.getId()) {
				contactList.remove(i);
				break;
			}
		}
	}
	
	//CRUD Adresse
	
	public static void createAdresse(int idContact, String typeParam, String numeroParam, String rueParam, String codePostalParam, String villeParam) {
		Contact contact = readContact(idContact);
		Adresse adresse = new Adresse();
		adresse.setType(typeParam);
		adresse.setNumero(numeroParam);
		adresse.setRue(rueParam);
		adresse.setCodePostal(codePostalParam);
		adresse.setVille(villeParam);
		contact.getAdresseList().add(adresse);
	}
	
	public static void addAdresse(int idContact, Adresse adresse) {
		Contact contact = readContact(idContact);
		contact.getAdresseList().add(adresse);
	}
	
	public static Adresse readAdresse(int idContact, int idAdresse) {
		Contact contact = readContact(idContact);
		for (Adresse adresse : contact.getAdresseList()) {
			if (idAdresse == adresse.getId()) {
				return adresse;
			}
		}
		return null;
	}
	
	public static List<Adresse> readAllAdresse(int idContact) {
		Contact contact = readContact(idContact);
		return contact.getAdresseList();
	}
	
	public static void updateAdresse(int idContact, int idAdresse, String typeParam, String numeroParam, String rueParam, String codePostalParam, String villeParam) {
		Contact contact = readContact(idContact);
		for (Adresse adresse : contact.getAdresseList()) {
			if (idAdresse == adresse.getId()) {
				adresse.setType(typeParam);
				adresse.setNumero(numeroParam);
				adresse.setRue(rueParam);
				adresse.setCodePostal(codePostalParam);
				adresse.setVille(villeParam);
			}
		}
	}
	
	public static void deleteAdresse(int idContact, int idAdresse) {
		Contact contact = readContact(idContact);
		List<Adresse> adresseList = contact.getAdresseList();
		for (int i = 0; i < adresseList.size(); i++) {
			if (idAdresse == adresseList.get(i).getId()) {
				adresseList.remove(i);
			}
		}
	}
	
	public static void sortContactByName() {
		Collections.sort(contactList);
	}
	
	public static List<Contact> searchContact(boolean critereExact, String critereParam, String keyword) {
		List<Contact> ret = new ArrayList<Contact>();
		if (critereExact) {
			for (Contact contact : contactList) {
				if (critereParam.equals("nom")) {
					if (contact.getNom().equals(keyword)) {
						ret.add(contact);
						continue;
					}
				}
				else if (critereParam.equals("prenom")) {
					if (contact.getPrenom().equals(keyword)) {
						ret.add(contact);
						continue;
					}
				}
			}
		}
		//Critere non exacte
		else {
			for (Contact contact : contactList) {
				if (critereParam.equals("nom")) {
					if (contact.getNom().contains(keyword)) {
						ret.add(contact);
						continue;
					}
				}
				else if (critereParam.equals("prenom")) {
					if (contact.getPrenom().contains(keyword)) {
						ret.add(contact);
						continue;
					}
				}
			}
		}
		return ret;
	}
	
}
